home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2006 May / PCpro_2006_05.ISO / files / mobile / fma-2.0-stable-setup.exe / {app} / source / uFMASync.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2004-06-25  |  5.3 KB  |  214 lines

  1. unit uFMASync;
  2.  
  3. {
  4. *******************************************************************************
  5. * Descriptions: FMA Contact Sync Unit
  6. * $Source: /cvsroot/fma/fma/uFMASync.pas,v $
  7. * $Locker:  $
  8. *
  9. * Todo:
  10. *   - Deal with contacts marked as Deleted, but are not deleted yet.
  11. *     This is a problem when conflicts arize (deleted and updated).
  12. *
  13. * Change Log:
  14. * $Log: uFMASync.pas,v $
  15. * Revision 1.3  2004/06/25 18:27:09  lordlarry
  16. * Added this changelog header
  17. *
  18. *
  19. }
  20.  
  21. interface
  22.  
  23. uses
  24.   uContactSync, uSyncPhonebook;
  25.  
  26. type
  27.   TContactDataState = (cdsNew, cdsModified, cdsDeleted, cdsNormal);
  28.  
  29.   TFMAContact = class(TContact)
  30.   private
  31.     FFMAContact: PContactData;
  32.   protected
  33.     function Exists: Boolean; override;
  34.   public
  35.     property FMAContact: PContactData read FFMAContact write FFMAContact;
  36.  
  37. //    function IsDeleted: Boolean; override;
  38.   end;
  39.  
  40.   TFMAContactSource = class(TContactSource)
  41.   protected
  42.     function GetName: String; override;
  43.     procedure Read(Contact: TFMAContact; FMAContact: PContactData);
  44.   public
  45.     function New: TContact; override;
  46.     function Add(Value: TContact): TContact; override;
  47.     procedure Update(Contact, Value: TContact); override;
  48.     procedure Delete(Contact: TContact); override;
  49.  
  50.     procedure Load; override;
  51.   end;
  52.  
  53. implementation
  54.  
  55. uses
  56.   Unit1, VirtualTrees, Dialogs, SysUtils, Forms;
  57.  
  58. { TFMAContactSource }
  59.  
  60. function TFMAContactSource.Add(Value: TContact): TContact;
  61. var Contact: TFMAContact;
  62.     ContactData: PContactData;
  63. begin
  64.   Contact := New as TFMAContact;
  65.   Contact.Clone(Value);
  66.   Contact.LinkedContact := Value;
  67.   Value.LinkedContact := Contact;
  68.   Contacts.Add(Contact);
  69.  
  70.   with Form1.frmSyncPhonebook do begin
  71.     if ListContacts.ChildCount[nil] >= FMaxRecME then
  72.       raise ESynchronize.CreateFmt('No more space in phonebook memory! %d is the maximum', [FMaxRecME]);
  73.  
  74.     ContactData := ListContacts.GetNodeData(ListContacts.AddChild(nil));
  75.     ContactData.CDID := NewGUID;
  76.   end;
  77.  
  78.   Contact.FMAContact := ContactData;
  79.   with Contact.FMAContact^ do begin
  80.     Title := Contact.Title;
  81.     Name := Contact.Name;
  82.     SurName := Contact.SurName;
  83.     Org := Contact.Organization;
  84.     Email := Contact.Email;
  85.     Home := Contact.HomePhone;
  86.     Work := Contact.WorkPhone;
  87.     Cell := Contact.CellPhone;
  88.     Fax := Contact.FaxPhone;
  89.     Other := Contact.OtherPhone;
  90.  
  91.     StateIndex := Integer(cdsNew);
  92.  
  93.     Contact.ID := GUIDToString(CDID);
  94.   end;
  95.  
  96.   Result := Contact;
  97. end;
  98.  
  99. procedure TFMAContactSource.Delete(Contact: TContact);
  100. begin
  101.   with Contact as TFMAContact do begin
  102.     FMAContact.StateIndex := Integer(cdsDeleted);
  103.     FMAContact := nil;
  104.   end;
  105. end;
  106.  
  107. function TFMAContactSource.GetName: String;
  108. begin
  109.   Result := 'FMA';
  110. end;
  111.  
  112. procedure TFMAContactSource.Load;
  113. var FMAContact: PContactData;
  114.     Contact: TFMAContact;
  115.     Node: PVirtualNode;
  116.     Count, CountNew, CountFiltered: Integer;
  117. begin
  118.   with Form1.frmSyncPhonebook.ListContacts do begin
  119.     Count := 0;
  120.     CountNew := 0;
  121.     CountFiltered := 0;
  122.  
  123.     Node := GetFirst;
  124.     while Assigned(Node) do begin
  125.       FMAContact := GetNodeData(Node);
  126.  
  127.       if TContactDataState(FMAContact.StateIndex) <> cdsDeleted then begin
  128.         Contact := Contacts.FindByID(GUIDToString(FMAContact.CDID)) as TFMAContact;
  129.  
  130.         if Assigned(Contact) then begin
  131.           Contact.FMAContact := FMAContact;
  132.         end
  133.         else begin
  134.           Contact := New as TFMAContact;
  135.           Contact.ID := GUIDToString(FMAContact.CDID);
  136.           Contact.SyncHash := Contact.Hash;
  137.           Contact.FMAContact := FMAContact;
  138.           Contacts.Add(Contact);
  139.  
  140.           Inc(CountNew);
  141.         end;
  142.  
  143.         Read(Contact, FMAContact);
  144.  
  145.         Inc(Count);
  146.       end
  147.       else
  148.         Inc(CountFiltered);
  149.  
  150.       Node := GetNext(Node);
  151.  
  152.       Application.ProcessMessages;
  153.     end;
  154.   end;
  155.  
  156.   SyncLogFmt('Loaded %d contacts (%d new, %d filtered out) from %s', [Count, CountNew, CountFiltered, Name]);
  157. end;
  158.  
  159. function TFMAContactSource.New: TContact;
  160. begin
  161.   Result := TFMAContact.Create(Self);
  162. end;
  163.  
  164. procedure TFMAContactSource.Read(Contact: TFMAContact; FMAContact: PContactData);
  165. begin
  166.   with FMAContact^ do begin
  167.     Contact.Title := Title;
  168.     Contact.Name := Name;
  169.     Contact.SurName := SurName;
  170.     Contact.Organization := Org;
  171.     Contact.Email := EMail;
  172.     Contact.HomePhone := Home;
  173.     Contact.WorkPhone := Work;
  174.     Contact.CellPhone := Cell;
  175.     Contact.FaxPhone := Fax;
  176.     Contact.OtherPhone := Other;
  177.   end;
  178. end;
  179.  
  180. procedure TFMAContactSource.Update(Contact, Value: TContact);
  181. begin
  182.   with (Contact as TFMAContact).FMAContact^ do begin
  183.     Title := Value.Title;
  184.     Name := Value.Name;
  185.     SurName := Value.SurName;
  186.     Org := Value.Organization;
  187.     Email := Value.Email;
  188.     Home := Value.HomePhone;
  189.     Work := Value.WorkPhone;
  190.     Cell := Value.CellPhone;
  191.     Fax := Value.FaxPhone;
  192.     Other := Value.OtherPhone;
  193.  
  194.     StateIndex := Integer(cdsModified);
  195.   end;
  196. end;
  197.  
  198. { TFMAContact }
  199.  
  200. function TFMAContact.Exists: Boolean;
  201. begin
  202.   Result := Assigned(FFMAContact);
  203. end;
  204.  
  205. {
  206. // This has as result that LinkedContact = nil
  207. function TFMAContact.IsDeleted: Boolean;
  208. begin
  209.   Result := inherited IsDeleted or (TContactDataState(FFMAContact.StateIndex) = cdsDeleted);
  210. end;
  211. }
  212.  
  213. end.
  214.